package multiplex.facade;

import java.util.List;

import multiplex.dataaccess.dao.CompraMarcadaDao;
import multiplex.dataaccess.dao.CompraNaoMarcadaDao;
import multiplex.model.Cadeira;
import multiplex.model.CompraMarcada;
import multiplex.model.CompraNaoMarcada;
import multiplex.model.Sessao;

public class CompraFacade {
	private CompraMarcadaDao compraMarcadaDAO = new CompraMarcadaDao();
	private CompraNaoMarcadaDao compraNaoMarcadaDAO = new CompraNaoMarcadaDao();

	public CompraFacade(){
		compraMarcadaDAO = new CompraMarcadaDao();
		compraNaoMarcadaDAO = new CompraNaoMarcadaDao();
	}
	
	public int cadCompraNaoMarcada(CompraNaoMarcada oCompra, Sessao oSessao){
		int numCadeirasCompradas=0;
		List<CompraNaoMarcada> comprasNaoMarcadas = compraNaoMarcadaDAO.getAllFromSessao(oSessao);
		for (CompraNaoMarcada compraNaoMarcada : comprasNaoMarcadas) {
			numCadeirasCompradas+=compraNaoMarcada.getNumCadeirasCompradas();
		}
		if(oCompra.getNumCadeirasCompradas()<=oSessao.getSala().getSalaTipo().getTamanho()-numCadeirasCompradas){
			return 0;
		}
		else{
			compraNaoMarcadaDAO.save(oCompra);
			return 1;
		}
	}
	
	public int cadCompraMarcada(CompraMarcada oCompra, Sessao oSessao){
		List<CompraMarcada> comprasMarcadas = compraMarcadaDAO.getAllFromSessao(oSessao);
		// verificar se as cadeiras são válidas
		int numLinhas = oSessao.getSala().getSalaTipo().getNumLinhas();
		int numColunas = oSessao.getSala().getSalaTipo().getNumColunas();
		for (Cadeira cadeira : oCompra.getCadeirasCompradas()) {
			if ( !(cadeira.getLinha()>=0 && cadeira.getLinha() < numLinhas &&
					cadeira.getColuna()>=0 && cadeira.getColuna() < numColunas)
					)
			{
				return 0;
			}
		}
		// para cada compra, verificar se existem cadeiras repetidas
		// for nas compras
		for (CompraMarcada compraJaEfetuada : comprasMarcadas) {
			// for nas cadeiras da compra já efetuada
			for (Cadeira cadeiraCompraJaEfetuada: compraJaEfetuada.getCadeirasCompradas()) {
				// for nas cadeiras da compra a ser efetuada
				for (Cadeira cadeiraCompraASerEfetuada: oCompra.getCadeirasCompradas()) {
					if (cadeiraCompraASerEfetuada.getLinha()==cadeiraCompraJaEfetuada.getLinha()
							&& cadeiraCompraASerEfetuada.getColuna()==cadeiraCompraJaEfetuada.getColuna()) {
						return 0;
					}
				}
			}
		}
		// se a compra é válida, salvar compra
		compraMarcadaDAO.save(oCompra);
		return 1;
	}
}
